package com.qf.day14;

import java.io.*;
import java.util.*;

/**
 * 1. 把文本文件中的IP地址进行去重，然后打印出来
 * 2. 统计一个文本文件中IP地址的出现的次数（IP地址格式为192.168.10.39，每行只存放一个IP地址）
 * 3. 查询出ip地址出现次数最多的是哪个IP
 * 4、査谢ip访问次数为前3名的ip是什么，和他们的访问次数 (对map中的健值对按照value 进行排序)
 */
public class HashmapDemo {

    public static void main(String[] args) throws FileNotFoundException {
        q02();
        q03();
    }
    // 2. 统计一个文本文件中IP地址的出现的次数（IP地址格式为192.168.10.39，每行只存放一个IP地址）
    private static void q02() throws FileNotFoundException, FileNotFoundException {
        //文件地址
        String d = "D:\\IP.txt";
        File file = new File(d);
        Scanner scanner = new Scanner(file);
        //2.统计一个文本文件中IP地址的出现的次数(IP地址格式为192.168.10.39，每行只存放一个IP地址)
        HashMap<String, Integer> map = new HashMap<>();
        while (scanner.hasNextLine()) {
            String s = scanner.nextLine();
            Integer oldValue = map.get(s);
            map.put(s,oldValue==null?1:oldValue+1);
        }
        System.out.println(map);
    }

    /**
     * 1. 把文本文件中的IP地址进行去重，然后打印出来
     *
     * @throws FileNotFoundException
     */
    private static void q01() throws FileNotFoundException {
        String filepath = "D:\\IP.txt";
        List<String> data = loadData(filepath);
        System.out.println(data);
        // 对data中的数据进行去重
        HashSet<String> set = new HashSet<>(data);
        System.out.println(set);
    }

    private static void wanghaibo() {
        String filepath = "D:\\IP.txt";
        // 可以去掉重复元素
        Set<String> uniqueIps = new HashSet<>();
        // 创建了一个可以按行读取文本文件内容的对象 BufferedReader
        try (BufferedReader reader = new BufferedReader(new FileReader(filepath))) {
            String line; // 局部变量line，用来存放每一行的数据
            while ((line = reader.readLine()) != null) {
                // 去除行首尾的空格，并将连续的空格替换为一个空格
                String trimmedLine = line.trim().replaceAll("\\s+", " ");
                // 假设每行只有一个IP地址，直接添加到集合中
                if (!trimmedLine.isEmpty() && isValidIp(trimmedLine.split(" ")[0])) {
                    uniqueIps.add(trimmedLine.split(" ")[0]);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        // 打印去重后的IP地址
        for (String ip : uniqueIps) {
            System.out.println(ip);
        }
    }

    /**
     * 把数据从文本文件中读取出来，放入List
     *
     * @param filepath
     * @return
     */
    public static List<String> loadData(String filepath) throws FileNotFoundException {

        // 创建扫描器对象用来扫描文件
        Scanner scanner = new Scanner(new File(filepath));
        // 创建List对象
        ArrayList<String> result = new ArrayList<>();
        // 逐行扫描文件
        String line = "";
        while (scanner.hasNextLine()) {
            line = scanner.nextLine();
            result.add(line);
        }
        // 关闭扫描器对象
        scanner.close();
        return result;

    }
    /**
     * 3. 查询出ip地址出现次数最多的是哪个IP
     *
     * @throws FileNotFoundException
     */
    private static void q03() throws FileNotFoundException {
        String filepath = "D:\\IP.txt";
        Map<String, Integer> ipCountMap = new HashMap<>();
        try (Scanner scanner = new Scanner(new File(filepath))) {
            while (scanner.hasNextLine()) {
                String ip = scanner.nextLine().trim();
                ipCountMap.put(ip, ipCountMap.getOrDefault(ip, 0) + 1);
            }
        }

        // 找出出现次数最多的IP地址
        String mostFrequentIP = Collections.max(ipCountMap.entrySet(), Map.Entry.comparingByValue()).getKey();
        int mostFrequentCount = Collections.max(ipCountMap.entrySet(), Map.Entry.comparingByValue()).getValue();

        System.out.println("出现次数最多的IP地址是: " + mostFrequentIP);
        System.out.println("出现次数: " + mostFrequentCount);
    }

//    // 4. 查询ip访问次数为前3名的ip是什么，和他们的访问次数
//    private static void q04() throws FileNotFoundException {
//        String filepath = "D:\\IP.txt";
//        Map<String, Integer> ipCountMap = new HashMap<>();
//        try (BufferedReader reader = new BufferedReader(new FileReader(filepath))) {
//            String line;
//            while ((line = reader.readLine()) != null) {
//                line = line.trim();
//                if (!line.isEmpty() && q04(line)) {
//                    ipCountMap.put(line, ipCountMap.getOrDefault(line, 0) + 1);
//                }
//            }
//        }
//        List<Map.Entry<String, Integer>> sortedEntries = new ArrayList<>(ipCountMap.entrySet());
//        sortedEntries.sort(Map.Entry.comparingByValue(Collections.reverseOrder()));
//        System.out.println("访问次数前3名的IP及次数：");
        // 检查字符串是否为有效的IPv4地址
    private static boolean isValidIp(String ip) {
        String IPADDRESS_PATTERN =
                "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
                        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
                        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
                        "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$";

        return ip.matches(IPADDRESS_PATTERN);
    }
}

